package com.yuyan.openapi.controller;

import com.alibaba.fastjson2.JSONObject;
import com.yuyan.openapi.rest.YuyanRestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 协议支付相关接口
 *
 * @author xm
 * @date 2024/4/25
 */
@RestController
@RequestMapping("protocolPay")
public class ProtocolPayController {
    @Autowired
    private YuyanRestUtil yuyanRestUtil;
    @Value("${yuyan.mc_no}")
    public String mc_no;
    private final String requestNo = "2024011400001";
    @Value("${yuyan.pay_callback}")
    public String pay_callback;

    /**
     * 协议用户注册签约
     */
    @GetMapping("register")
    public Object register() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("bankAccountNo", "");
        requestMap.put("bankAccountName", "");
        requestMap.put("payerPhone", "");
        requestMap.put("certNo", "");
        requestMap.put("cvv", "");
        requestMap.put("validTime", "");
        requestMap.put("mobileImel", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/register");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 协议用户注册查询信息
     */
    @GetMapping("info")
    public Object info() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("protocolNo", "PP202404250000002");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/info");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 协议用户注册确认签约
     */
    @GetMapping("confirm")
    public Object confirm() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("protocolNo", "PP202404250000002");
        requestMap.put("smsCode", "394819");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/confirm");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 协议用户注册解约
     */
    @GetMapping("cancel")
    public Object cancel() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("protocolNo", "PP202404250000002");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/cancel");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 协议支付下单
     */
    @GetMapping("order")
    public Object order() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", requestNo);
        requestMap.put("protocolNo", "PP202404250000002");
        requestMap.put("amount", "0.01");
        requestMap.put("remark", "测试api下单");
        requestMap.put("goodsName", "测试api协议支付");
        requestMap.put("payTimeLimit", "2024-04-25 23:29:00");
        requestMap.put("extraCommonParam", "");
        requestMap.put("notifyUrl", pay_callback);
        requestMap.put("payerIp", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/order");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 协议支付下单重发验证码
     */
    @GetMapping("orderResetCode")
    public Object orderResetCode() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", requestNo);
        requestMap.put("tradeNo", "SDYY2024042500000003");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/orderResetCode");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 协议支付下单确认支付
     */
    @GetMapping("orderConfirm")
    public Object orderConfirm() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", requestNo);
        requestMap.put("tradeNo", "SDYY2024042500000003");
        requestMap.put("smsCode", "373408");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/protocolPay/orderConfirm");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }
}
